package it.scambiocorse.pubblica.controller;

import java.util.ArrayList;
import java.util.List;

import it.scambiocorse.dao.AreaPubService;
import it.scambiocorse.dao.AreaService;
import it.scambiocorse.dao.ClienteService;
import it.scambiocorse.dao.CodaDao;
import it.scambiocorse.dao.CodaService;
import it.scambiocorse.dao.FeedbackService;
import it.scambiocorse.dao.ServizioService;
import it.scambiocorse.dao.UtenteService;
import it.scambiocorse.model.AreaType;
import it.scambiocorse.model.AutistaType;
import it.scambiocorse.model.ClienteType;
import it.scambiocorse.model.CodaType;
import it.scambiocorse.model.FeedBackType;
import it.scambiocorse.model.ServizioType;
import it.scambiocorse.model.SorgenteType;
import it.scambiocorse.model.UtenteType;
import it.scambiocorse.utils.InviaEmail;
import it.scambiocorse.utils.LabelValueBean;
import it.scambiocorse.utils.ResourceManager;
import it.scambiocorse.utils.Utils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.mvc.multiaction.*;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;

public class CopyOfAreaPubblicaMultiController_COPY extends  MultiActionController {
	private ServizioService servizioDao = null;
	private AreaPubService areaPubDao = null;
	private UtenteService utenteDao = null;
	private CodaService codaDao = null;
	private FeedbackService feedbackDao = null;



	

	public FeedbackService getFeedbackDao() {
		return feedbackDao;
	}
	public void setFeedbackDao(FeedbackService feedbackDao) {
		this.feedbackDao = feedbackDao;
	}
	public CodaService getCodaDao() {
		return codaDao;
	}
	public void setCodaDao(CodaService codaDao) {
		this.codaDao = codaDao;
	}
	public AreaPubService getAreaPubDao() {
		return areaPubDao;
	}
	public void setAreaPubDao(AreaPubService areaPubDao) {
		this.areaPubDao = areaPubDao;
	}
	public ServizioService getServizioDao() {
		return servizioDao;
	}
	public void setServizioDao(ServizioService servizioDao) {
		this.servizioDao = servizioDao;
	}
	public UtenteService getUtenteDao() {
		return utenteDao;
	}
	public void setUtenteDao(UtenteService utenteDao) {
		this.utenteDao = utenteDao;
	}


	final Logger logger = Logger.getLogger(getClass());


	public ModelAndView listaServizi(HttpServletRequest request, HttpServletResponse response) throws Exception {
		UtenteType dettaglio =  null;
		String url = null;
		try {
			
			
				ModelAndView mav = null;
				HttpSession session = request.getSession(false);
				if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
					session = request.getSession(true);
					logger.warn("Sessione Scaduta");
					return new ModelAndView("expired");
				} else {
					dettaglio = (UtenteType)session.getAttribute("dettaglio");
					if (!dettaglio.isAccessoPubblico()) {
						logger.debug("L'utente NON puo' accedere all'area pubblica");
						 mav = new ModelAndView("accessDenied");
						 return mav;
					}
				}

				url = "pubListaServizi";
				mav = new ModelAndView(url);
				ArrayList<ServizioType> listaServizi = null;
				
				ArrayList<CodaType> listaCode = null;
				
				String dataIniz = Utils.getSysDateStr();
				String dataFine = null;
				listaServizi = servizioDao.listaServiziPubblici(dataIniz, dataFine);

				
				
				logger.warn("Procedo al redirect "+url);
				
				mav.addObject("dataIniz", dataIniz);
				mav.addObject("dataFine", dataFine);
				mav.addObject("listaServizi", listaServizi);
				mav.addObject("listaCode", listaCode);
				mav.addObject("dettaglio", dettaglio);
				mav.addObject("caller", "listaServizi.html");

				
				return mav;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+(!Utils.isNull(dettaglio) ? dettaglio.getIdUser() : "N/A"));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject("errore", e.getMessage());
		}
	}	
	

	
	public ModelAndView dettaglioServizio(HttpServletRequest request, HttpServletResponse response, ServizioType s) throws Exception {
			UtenteType dettaglio =  null;
			String url = null;
		    List<LabelValueBean> errori = new ArrayList<LabelValueBean>();
		    List<LabelValueBean> ok = new ArrayList<LabelValueBean>();			
			ModelAndView mav = new ModelAndView(url);
			try {
				
					HttpSession session = request.getSession(false);
					if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
						session = request.getSession(true);
						logger.warn("Sessione Scaduta");
						return new ModelAndView("expired");
					} else {
						dettaglio = (UtenteType)session.getAttribute("dettaglio");
						if (!dettaglio.isAccessoPubblico()) {
							logger.debug("L'utente NON puo' accedere all'area pubblica");
							 mav = new ModelAndView("accessDenied");
							 return mav;
						}
					}
					
					s = servizioDao.dettaglioServizioPubblico(s.getIdServ());	
					boolean isOwner = (dettaglio.getIdUser() == s.getIdUserInse());
					
					if (isOwner) {
						url = "pubDettaglioServizioOut";
					} else {
						url = "pubDettaglioServizioIn";
					}
					
					mav = new ModelAndView(url);
					boolean isAcquisibile = false;
					CodaType coda = null;
					ArrayList<CodaType> listaCodeServizio = null;
					if (!isOwner) {
						//Controllo che sia acquisibile
						coda = codaDao.getCoda(dettaglio.getIdUser(), s.getIdServ());
						if (coda == null && s.getDataFine() == null && s.getIdUserExec() == 0) { //****ACQUISIBILE*** Data Fine e' impostata anche nel caso in cui l'owner l'abbia cancellato) { //NON SI E' MESSO IN CODA
								ok.add(new LabelValueBean("SERVIZIO ACQUISIBILE", ""));
							} else if (coda != null && coda.getEsito() == 1) { // SI E' GIA MESSO IN CODA
									ok.add(new LabelValueBean("Sei in attesa che ti venga confermato il servizio, riceverai un messaggio non appena l'utente avra' scelto a chi assegnare il servizio", ""));
							}					
						 else { //NON E' ACQUISIBILE, PUO' ESSERE STATO GIA' ASSEGNATO, ASSEGNATO A LUI, RIMOSSO
							if (s.getIdUserExec() > 0 && s.getIdUserExec() != dettaglio.getIdUser()) { //ASSEGNATO ALL'UTENTE CORRENTE
								ok.add(new LabelValueBean("Sfortunatamente il servizio e' stato assegnato ad un'altro utente", ""));
							} else if (s.getIdUserExec() > 0 && s.getIdUserExec() == dettaglio.getIdUser()) { //ASSEGNATO ALL'UTENTE CORRENTE
								ok.add(new LabelValueBean("Questo servizio ti e' stato assegnato", ""));
							} else if (s.getIdUserExec() == 0 && s.getDataFine() != null) {// E' STATO RIMOSSO
								errori.add(new LabelValueBean("Il servizio e' stato ritirato dall'area pubblica", ""));
							}
						 }
						mav.addObject("u", utenteDao.getUser(s.getIdUserInse()));
						
						
					} else { 	// FINE if OWNER
						
						 logger.debug("E' il proprietario del servizio !!!");
						 int idUserExec = s.getIdUserExec();
						 if (idUserExec > 0 ) {
							ok.add(new LabelValueBean("Servizio assegnato", ""));
							logger.debug("Il servizio e' stato gia' assegnato");
							UtenteType assegnato = utenteDao.getUser(idUserExec);
							mav.addObject("autistaExec", assegnato);
							mav.addObject("assigned", true);
						 } else {
							logger.debug("Il servizio non e' stato ancora assegnato");
							listaCodeServizio = codaDao.getCodePerServ(s.getIdServ());

						 }
						 
						
					}
						
						
					
				
					logger.warn("Procedo al redirect "+url);
					mav.addObject("listaCodeServizio", listaCodeServizio);
					mav.addObject("servizio", s);
					mav.addObject("dettaglio", dettaglio);
					mav.addObject("coda", coda);
					mav.addObject("back", request.getParameter("caller"));

					
			    	if (errori.size() > 0) {
			    		request.setAttribute("listaErrori", errori);
			    	}
			    	if (ok.size() > 0) {
			    		request.setAttribute("listaOk", ok);
			    	}
			    	
			    	
					return mav;
					
			}catch (Exception e) {
				logger.error("SI E' VERIFICATO UN ERRORE");
				logger.error("Utente: "+(!Utils.isNull(dettaglio) ? dettaglio.getIdUser() : "N/A"));
				logger.error(e);
				mav = new ModelAndView("gestioneErrore");
				mav.addObject("errore", e.getMessage());
				return mav;			}
		}	
	
	
	
	
	public ModelAndView acquisisciServizio(HttpServletRequest request, HttpServletResponse response, ServizioType s) throws Exception {
		UtenteType dettaglio =  null;
		String url = null;
	    List<LabelValueBean> errori = new ArrayList<LabelValueBean>();
	    List<LabelValueBean> ok = new ArrayList<LabelValueBean>();			
		ModelAndView mav = new ModelAndView(url);
		try {
			
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
				if (!dettaglio.isAccessoPubblico()) {
					logger.debug("L'utente NON puo' accedere all'area pubblica");
					 mav = new ModelAndView("accessDenied");
					 return mav;
				}
			}
			
			s = servizioDao.dettaglioServizioPubblico(s.getIdServ());	
			boolean isOwner = (dettaglio.getIdUser() == s.getIdUserInse());
			boolean isAssigned = false;
				url = "pubDettaglioServizioIn";
			
			mav = new ModelAndView(url);
			CodaType coda = null;
	if (!isOwner) {
				//Controllo che sia acquisibile
				if (s.getDataFine() == null && s.getIdUserExec() == 0) { //********ACQUISIBILE*** Data Fine e' impostata anche nel caso in cui l'owner l'abbia cancellato
					logger.debug("Servizio Acquisibile");
					coda = codaDao.getCoda(dettaglio.getIdUser(), s.getIdServ());
					if (coda != null) { // SI E' MESSO GIA' IN CODA
						errori.add(new LabelValueBean("Ti sei gia' prenotato per questo servizio, clicka sul menu a sinistra \"Servizi in entrata\" per controllarne lo stato", ""));
						isAssigned = true;

					} else  { // NON SI E' MESSO IN CODA
						logger.debug("Il servizio e' acquisibile e l'utente non ha code, procedo all'inserimento");
						UtenteType appo = utenteDao.getUser(dettaglio.getIdUser());
							if (appo.getCrediti() < s.getCommissione()+1) {
								errori.add(new LabelValueBean("Non hai abbastanza crediti per prenotare questo servizio! Clicka sul menu Gestione Crediti per ulteriori dettagli", ""));
							} else {
								int idCoda = codaDao.inserisciCoda(dettaglio.getIdUser(), s.getIdServ());
								if (idCoda > 0) {
									logger.debug("Coda inserita correttamente, id_coda = "+idCoda);
									ok.add(new LabelValueBean("Complimenti ti sei prenotato per questo servizio! Attendi che il proprietario assegni la corsa, ti verra' inviato un messaggio con l'esito", ""));
									isAssigned = true;
								} else {
									logger.debug("Coda NON inserita");
									errori.add(new LabelValueBean("Si sono dei verificati dei problemi, probabilmente il servizio non e' piu' acquisibile.", ""));
								}
								
							}
					}					
					
					
				} else { //*************************NON E' ACQUISIBILE, PUO' ESSERE STATO GIA' ASSEGNATO, ASSEGNATO A LUI, RIMOSSO
						errori.add(new LabelValueBean("Sfortunatamente il servizio non e' piu' acquisibile", ""));
				}
				
	} else { //SE PROVASSE AD AUTO ACQUISIRE UN SERVIZIO
				mav = new ModelAndView(new RedirectView("dettaglioServizio.html?idServ="));// FINE if OWNER
	}
		
			
			logger.warn("Procedo al redirect "+url);
			mav.addObject("servizio", s);
			mav.addObject("isAssigned", isAssigned);
			mav.addObject("coda", coda);
			mav.addObject("dettaglio", dettaglio);
			mav.addObject("back", request.getParameter("caller"));

	    	if (errori.size() > 0) {
	    		request.setAttribute("listaErrori", errori);
	    	}
	    	if (ok.size() > 0) {
	    		request.setAttribute("listaOk", ok);
	    	}
		    	
		    	
			return mav;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+(!Utils.isNull(dettaglio) ? dettaglio.getIdUser() : "N/A"));
			logger.error(e);
			mav = new ModelAndView("gestioneErrore");
			mav.addObject("errore", e.getMessage());
			return mav;		}
	}	

	
	public ModelAndView assegnaServizio(HttpServletRequest request, HttpServletResponse response, ServizioType s) throws Exception {
		UtenteType dettaglio =  null;
		String url = null;

	    List<LabelValueBean> errori = new ArrayList<LabelValueBean>();
	    List<LabelValueBean> ok = new ArrayList<LabelValueBean>();			
		ModelAndView mav = new ModelAndView(url);
		try {
			
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
				if (!dettaglio.isAccessoPubblico()) {
					logger.debug("L'utente NON puo' accedere all'area pubblica");
					 mav = new ModelAndView("accessDenied");
					 return mav;
				}
			}
			
			s = servizioDao.dettaglioServizioPubblico(s.getIdServ());	
			boolean isOwner = (dettaglio.getIdUser() == s.getIdUserInse());
			
				url = "pubDettaglioServizioOut";
			
			mav = new ModelAndView(url);
			CodaType coda = null;
	if  (s.getIdUserExec() < 1) { // controllo che non sia gia' assegnato
	if (isOwner) {

		
		
				String idUserSTR = request.getParameter("userExec");
				int idUserScelto = Utils.isValid(idUserSTR) ? Integer.parseInt(idUserSTR) : 0;
				
				if (idUserScelto > 0) {
					logger.debug("Controllo che l'utente sia ancora in coda");
					coda = codaDao.getCoda(idUserScelto, s.getIdServ());
					if (coda != null && coda.getDataFine() == null) {
						logger.debug("L'utente e' ancora in coda, procedo all'assegnazione");
						
						
						try {
							servizioDao.assegnaCorsa(s.getIdServ(), idUserScelto);	
							UtenteType assegnato = utenteDao.getUser(idUserScelto);
							dettaglio = utenteDao.getUser(dettaglio.getIdUser());
							
							mav.addObject("autistaExec", assegnato);
							mav.addObject("assigned", true);
							ok.add(new LabelValueBean("HAI APPENA ASSEGNATO LA CORSA!", ""));
							ok.add(new LabelValueBean("Il tuo nuovo credito e': "+dettaglio.getCrediti(), ""));

							
						} catch (Exception e) {
							logger.error("SI E' VERIFICATO UN ERRORE DURANTE L'ASSEGNAZIONE DELLA CORSA");
							throw e;
						}
						
						
					} else {
						errori.add(new LabelValueBean("L'utente non e' piu' in coda per questo servizio, seleziona un'altro utente o attendi che altri si mettano in coda", ""));
					}
				} else {
					errori.add(new LabelValueBean("Devi selezionare almeno un utente per assegnarli il servizio", ""));
				}
	} else { //SE PROVASSERO AD AUTO ASSEGNARSI UN SERVIZIO
				mav = new ModelAndView("accessDenied");// FINE if OWNER
	}
	}
		
			logger.warn("Procedo al redirect "+url);
			mav.addObject("servizio", s);
			mav.addObject("back", request.getParameter("caller"));
			mav.addObject("coda", coda);
			mav.addObject("dettaglio", dettaglio);
			
	    	if (errori.size() > 0) {
	    		request.setAttribute("listaErrori", errori);
				mav.addObject("listaCodeServizio", codaDao.getCodePerServ(s.getIdServ()));
	    	}
	    	if (ok.size() > 0) {
	    		request.setAttribute("listaOk", ok);
	    	}
		    	
		    	
			return mav;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+(!Utils.isNull(dettaglio) ? dettaglio.getIdUser() : "N/A"));
			logger.error(e);
			mav = new ModelAndView("gestioneErrore");
			mav.addObject("errore", e.getMessage());
			return mav;
		}
	}	
	

	
	public ModelAndView cancellaServizio(HttpServletRequest request, HttpServletResponse response, ServizioType s) throws Exception {
		UtenteType dettaglio =  null;
		String url = null;
	    List<LabelValueBean> errori = new ArrayList<LabelValueBean>();
	    List<LabelValueBean> ok = new ArrayList<LabelValueBean>();			
		ModelAndView mav = new ModelAndView(url);
		try {
			
			
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
				if (!dettaglio.isAccessoPubblico()) {
					logger.debug("L'utente NON puo' accedere all'area pubblica");
					 mav = new ModelAndView("accessDenied");
					 return mav;
				}
			}
	
				url = "pubListaServizi";
				mav = new ModelAndView(url);
				 
				s = servizioDao.dettaglioServizioPubblico(s.getIdServ());	
				
				
				logger.warn("Procedo al redirect "+url);
				
				mav.addObject("servizio", s);
				mav.addObject("dettaglio", dettaglio);
				
				
		    	if (errori.size() > 0) {
		    		request.setAttribute("listaErrori", errori);
		    	}
		    	
		    	if (ok.size() > 0) {
		    		request.setAttribute("listaOk", ok);
		    	}
		    	
		    	
				return mav;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+(!Utils.isNull(dettaglio) ? dettaglio.getIdUser() : "N/A"));
			logger.error(e);
			mav = new ModelAndView("gestioneErrore");
			mav.addObject("errore", e.getMessage());
			return mav;		}
	}
	public ModelAndView listaServiziIn(HttpServletRequest request, HttpServletResponse response) throws Exception {
		UtenteType dettaglio =  null;
		String url = null;
		try {
			
			ModelAndView mav = null;
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
				if (!dettaglio.isAccessoPubblico()) {
					logger.debug("L'utente NON puo' accedere all'area pubblica");
					 mav = new ModelAndView("accessDenied");
					 return mav;
				}
			}

				url = "pubListaServiziIn";
				mav = new ModelAndView(url);
				ArrayList<ServizioType> listaServizi = null;
				ArrayList<CodaType> listaCode = null;
				
					logger.debug("L'utente puo' accedere all'area pubblica, procedo al caricamento dei servizi");
					listaServizi =  servizioDao.listaServiziPubbliciIN(dettaglio.getIdUser(), null, null);
					
					
				
				logger.warn("Procedo al redirect "+url);
				mav.addObject("listaServizi", listaServizi);
				mav.addObject("listaCode", listaCode);
				mav.addObject("dettaglio", dettaglio);
				mav.addObject("caller", "listaServiziIn.html");

				return mav;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+(!Utils.isNull(dettaglio) ? dettaglio.getIdUser() : "N/A"));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject("errore", e.getMessage());
		}
	}	
	
	
	
	public ModelAndView listaServiziOut(HttpServletRequest request, HttpServletResponse response) throws Exception {
		UtenteType dettaglio =  null;
		String url = null;
		try {
			
			ModelAndView mav = null;
			HttpSession session = request.getSession(false);
			if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
				session = request.getSession(true);
				logger.warn("Sessione Scaduta");
				return new ModelAndView("expired");
			} else {
				dettaglio = (UtenteType)session.getAttribute("dettaglio");
				if (!dettaglio.isAccessoPubblico()) {
					logger.debug("L'utente NON puo' accedere all'area pubblica");
					 mav = new ModelAndView("accessDenied");
					 return mav;
				}
			}

				url = "pubListaServiziOut";
				mav = new ModelAndView(url);
				ArrayList<ServizioType> listaServizi = null;
				ArrayList<CodaType> listaCode = null;
				
					logger.debug("L'utente puo' accedere all'area pubblica, procedo al caricamento dei servizi");
					listaServizi =  servizioDao.listaServiziPubbliciOUT(dettaglio.getIdUser(), null, null);
					
					
				
				logger.warn("Procedo al redirect "+url);
				mav.addObject("listaServizi", listaServizi);
				mav.addObject("listaCode", listaCode);
				mav.addObject("dettaglio", dettaglio);
				mav.addObject("caller", "listaServiziOut.html");

				
				return mav;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+(!Utils.isNull(dettaglio) ? dettaglio.getIdUser() : "N/A"));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject("errore", e.getMessage());
		}
	}	
		
	
	public ModelAndView listaFeedback(HttpServletRequest request, HttpServletResponse response) throws Exception {
		UtenteType dettaglio =  null;
		String url = null;
		try {
			
			
				ModelAndView mav = null;
				HttpSession session = request.getSession(false);
				if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
					session = request.getSession(true);
					logger.warn("Sessione Scaduta");
					return new ModelAndView("expired");
				} else {
					dettaglio = (UtenteType)session.getAttribute("dettaglio");
					if (!dettaglio.isAccessoPubblico()) {
						logger.debug("L'utente NON puo' accedere all'area pubblica");
						 mav = new ModelAndView("accessDenied");
						 return mav;
					}
				}
				
				String idUserStr = request.getParameter("idUser");
				int idUser = (Utils.isValid(idUserStr) ? Integer.parseInt(idUserStr): 0);
				int pendingIn = 0;
				int pendingOut = 0;  
				UtenteType utente = null;
				ArrayList<FeedBackType> listaFeedback = null;
				if (idUser > 0) {
					url = "pubListaFeedbackExt";
					mav = new ModelAndView(url);
					logger.debug("Richiesta lista feedback da un altro utente");
					listaFeedback = feedbackDao.listaFeedbackIn(idUser);
					utente = utenteDao.getUser(idUser);
					mav.addObject("utente", utente);

				} else {
					url = "pubListaFeedback";
					mav = new ModelAndView(url);
					logger.debug("Richiesta lista feedback da utente loggato");
					
					listaFeedback = feedbackDao.listaFeedbackIn(dettaglio.getIdUser());

					pendingIn = feedbackDao.pendingIn(dettaglio.getIdUser());
					pendingOut =  feedbackDao.pendingOut(dettaglio.getIdUser());
					mav.addObject("pending", pendingIn+pendingOut);

					
				}
				logger.warn("Procedo al redirect "+url);


				mav.addObject("listaFeedback", listaFeedback);
				return mav;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+(!Utils.isNull(dettaglio) ? dettaglio.getIdUser() : "N/A"));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject("errore", e.getMessage());
		}
	}		

	
	public ModelAndView listaFeedbackPending(HttpServletRequest request, HttpServletResponse response) throws Exception {
		UtenteType dettaglio =  null;
		String url = null;
		try {
			
			
				ModelAndView mav = null;
				HttpSession session = request.getSession(false);
				if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
					session = request.getSession(true);
					logger.warn("Sessione Scaduta");
					return new ModelAndView("expired");
				} else {
					dettaglio = (UtenteType)session.getAttribute("dettaglio");
					if (!dettaglio.isAccessoPubblico()) {
						logger.debug("L'utente NON puo' accedere all'area pubblica");
						 mav = new ModelAndView("accessDenied");
						 return mav;
					}
				}
				url = "pubListaFeedbackPending";
				mav = new ModelAndView(url);
				
				
				ArrayList<FeedBackType> pendingIn = feedbackDao.listaFeedbackPendingIn(dettaglio.getIdUser());
				ArrayList<FeedBackType> pendingOut =  feedbackDao.listaFeedbackPendingOut(dettaglio.getIdUser());;
				
				logger.warn("Procedo al redirect "+url);
				
				mav.addObject("pendingIn", pendingIn);
				mav.addObject("pendingOut", pendingOut);
				

				
				return mav;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+(!Utils.isNull(dettaglio) ? dettaglio.getIdUser() : "N/A"));
			logger.error(e);
			return new ModelAndView("gestioneErrore").addObject("errore", e.getMessage());
		}
	}		

	
	
	
	public ModelAndView dettaglioFeedback(HttpServletRequest request, HttpServletResponse response, FeedBackType fIn) throws Exception {
		UtenteType dettaglio =  null;
		String url = null;
	    List<LabelValueBean> errori = new ArrayList<LabelValueBean>();
	    List<LabelValueBean> ok = new ArrayList<LabelValueBean>();			
		ModelAndView mav = null;
		try {
			
				HttpSession session = request.getSession(false);
				if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
					session = request.getSession(true);
					logger.warn("Sessione Scaduta");
					return new ModelAndView("expired");
				} else {
					dettaglio = (UtenteType)session.getAttribute("dettaglio");
					if (!dettaglio.isAccessoPubblico()) {
						logger.debug("L'utente NON puo' accedere all'area pubblica");
						 mav = new ModelAndView("accessDenied");
						 return mav;
					}
				}
				String caller = request.getParameter("caller");
				UtenteType mittente = null;
				FeedBackType fOut = null;
				url = "pubDettaglioFeedback";
				mav = new ModelAndView(url);
				
				if ("listaFeedbackPending.html".equals(caller)) {
					logger.debug("Provengo da FEEDBACK PENDING inverto l'ordine del fIn e dell' fOut");
					
					fOut = feedbackDao.getFeedback(fIn.getIdFeed());
					fIn = feedbackDao.getFeedbackIn(dettaglio.getIdUser(), fOut.getIdServ() );
					mittente = utenteDao.getUser(fIn.getIdUserInse());
					
					
				} else {
					fIn = feedbackDao.getFeedback(fIn.getIdFeed());
					mittente = utenteDao.getUser(fIn.getIdUserInse());
					fOut = feedbackDao.getFeedbackOut(dettaglio.getIdUser(), fIn.getIdServ() );
				}
				
				
				ServizioType s = servizioDao.dettaglioServizioPubblico(fIn.getIdServ());	
				

			
				logger.warn("Procedo al redirect "+url);
				mav.addObject("fIn", fIn);
				mav.addObject("mittente", mittente);
				mav.addObject("fOut", fOut);
				mav.addObject("servizio", s);
				mav.addObject("dettaglio", dettaglio);
				mav.addObject("back", caller);

				
		    	if (errori.size() > 0) {
		    		request.setAttribute("listaErrori", errori);
		    	}
		    	if (ok.size() > 0) {
		    		request.setAttribute("listaOk", ok);
		    	}
		    	
		    	
				return mav;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+(!Utils.isNull(dettaglio) ? dettaglio.getIdUser() : "N/A"));
			logger.error(e);
			mav = new ModelAndView("gestioneErrore");
			mav.addObject("errore", e.getMessage());
			return mav;		}
	}	
	
	
	public ModelAndView inserisciFeedback(HttpServletRequest request, HttpServletResponse response, FeedBackType f) throws Exception {
		UtenteType dettaglio =  null;
		String url = null;
	    List<LabelValueBean> errori = new ArrayList<LabelValueBean>();
	    List<LabelValueBean> ok = new ArrayList<LabelValueBean>();			
		ModelAndView mav = null;
		try {
			
				HttpSession session = request.getSession(false);
				if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
					session = request.getSession(true);
					logger.warn("Sessione Scaduta");
					return new ModelAndView("expired");
				} else {
					dettaglio = (UtenteType)session.getAttribute("dettaglio");
					if (!dettaglio.isAccessoPubblico()) {
						logger.debug("L'utente NON puo' accedere all'area pubblica");
						 mav = new ModelAndView("accessDenied");
						 return mav;
					}
				}
				
				url = "pubInserisciFeedback";
				String caller = request.getParameter("caller");
				mav = new ModelAndView(url);
				FeedBackType fIn = null;
				UtenteType mittente = null;
				ServizioType s = null;
				String tipoOpe = request.getParameter("form");
				if (!Utils.isValid(tipoOpe)) {
					f = feedbackDao.getFeedback(f.getIdFeed());
					mav.addObject("fOut", f);
				} else 	if (Utils.isValid(tipoOpe) && "1".equals(tipoOpe)) {
					if (f.getTipoFeedback() == 0) {
						errori.add(new LabelValueBean("Specifica il tipo di feedback (positivo, neutro o negativo)", ""));
					} else if (!Utils.isValid(f.getFeedback())) {
						errori.add(new LabelValueBean("Inserisci il feedback descrivendo in generale come e' andata la transazione)", ""));
					} else {
						f.setIdUserInse(dettaglio.getIdUser());
						int idFeed = feedbackDao.inserisciFeedback(f);
						f = feedbackDao.getFeedback(f.getIdFeed());
						fIn = feedbackDao.getFeedbackIn(dettaglio.getIdUser(), f.getIdServ());
						mittente = utenteDao.getUser(f.getIdUser());
						s = servizioDao.dettaglioServizioPubblico(f.getIdServ());
						mav = new ModelAndView("pubDettaglioFeedback");
						caller = "listaFeedback.html";
					}
					
				}
				
			
				logger.warn("Procedo al redirect "+url);
				mav.addObject("fIn", fIn);
				mav.addObject("mittente", mittente);
				mav.addObject("fOut", f);
				mav.addObject("servizio", s);
				mav.addObject("dettaglio", dettaglio);
				mav.addObject("back", caller);

				
		    	if (errori.size() > 0) {
		    		request.setAttribute("listaErrori", errori);
		    	}
		    	if (ok.size() > 0) {
		    		request.setAttribute("listaOk", ok);
		    	}
		    	
		    	
				return mav;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+(!Utils.isNull(dettaglio) ? dettaglio.getIdUser() : "N/A"));
			logger.error(e);
			mav = new ModelAndView("gestioneErrore");
			mav.addObject("errore", e.getMessage());
			return mav;		}
	}			

	
	public ModelAndView profiloUtente(HttpServletRequest request, HttpServletResponse response, UtenteType u) throws Exception {
		UtenteType dettaglio =  null;
		String url = null;
	    List<LabelValueBean> errori = new ArrayList<LabelValueBean>();
	    List<LabelValueBean> ok = new ArrayList<LabelValueBean>();			
		ModelAndView mav = null;
		try {
			
				HttpSession session = request.getSession(false);
				if (Utils.isNull(session) || session.getAttribute("dettaglio") == null) {
					session = request.getSession(true);
					logger.warn("Sessione Scaduta");
					return new ModelAndView("expired");
				} else {
					dettaglio = (UtenteType)session.getAttribute("dettaglio");
					if (!dettaglio.isAccessoPubblico()) {
						logger.debug("L'utente NON puo' accedere all'area pubblica");
						 mav = new ModelAndView("accessDenied");
						 return mav;
					}
				}
				
				url = "profiloUtente";
				mav = new ModelAndView(url);
				
				int idUser = 0;
				if (u.getIdUser() > 0) {
					idUser = u.getIdUser();
				} else {
					idUser = dettaglio.getIdUser();
				}
				u = utenteDao.getUser(idUser);
				ArrayList<FeedBackType> listaFeed = feedbackDao.listaFeedbackIn(idUser);
				
				int totPos = 0;
				int totNeg = 0;
				int totNeu = 0;

				for (FeedBackType ff : listaFeed) {
					switch (ff.getTipoFeedback()) {
					case 1: totPos++; break;
					case 2: totNeu++; break;
					case 3: totNeg++; break;
					}
				}
				
				double perc = 0.0;
				perc = (100 * totPos) / listaFeed.size();
						
			
				logger.warn("Procedo al redirect "+url);
				mav.addObject("perc", perc);
				mav.addObject("totPos", totPos);
				mav.addObject("totNeg", totNeg);
				mav.addObject("totNeu", totNeu);
				mav.addObject("dettaglio", dettaglio);
				mav.addObject("u", u);
				mav.addObject("listaFeedback", listaFeed);
				mav.addObject("back", request.getParameter("caller"));

				
		    	if (errori.size() > 0) {
		    		request.setAttribute("listaErrori", errori);
		    	}
		    	if (ok.size() > 0) {
		    		request.setAttribute("listaOk", ok);
		    	}
		    	
		    	
				return mav;
				
		}catch (Exception e) {
			logger.error("SI E' VERIFICATO UN ERRORE");
			logger.error("Utente: "+(!Utils.isNull(dettaglio) ? dettaglio.getIdUser() : "N/A"));
			logger.error(e);
			mav = new ModelAndView("gestioneErrore");
			mav.addObject("errore", e.getMessage());
			return mav;		}
	}	

	
}
